package com.ce.webframework.i18n;

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;

import com.ce.webframework.common.util.PropertyReader;
import com.sitechasia.webx.core.utils.base.ResourceFinder;

/**
 *
 * 功能描述：进行异常信息国际化类
 *
 * @author 邓成东
 * @create date : 2007-10-10
 */
public class ExceptionMessageLocale {
	/**
	 * 日志对象.
	 */
	protected final Logger logger = Logger.getLogger(getClass());

	/**
	 * @see javax.servlet.http.HttpServletRequest
	 */
	private HttpServletRequest request;

	/**
	 * 默认的国际化字符串，在web.xml设置，支持多个默认配置,用;隔开
	 */
	private String defaultLocaleStr;

	/**
	 * 当前国际化字符串
	 */
	private String localeStr;

	/**
	 * 本类的构造函数
	 *
	 * @param request
	 */
	public ExceptionMessageLocale(HttpServletRequest request) {
		this.request = request;
	}

	/**
	 * 读取国际化资源文件
	 *
	 * @param fileName
	 *            当前异常信息对应的国际化文件名
	 * @param key
	 *            当前异常信息对应的国际化内容的key
	 * @return 异常信息
	 */
	public String getLocaleMessage(String fileName, String key) {

		if (request == null) {
			return null;
		}
		Locale locale = request.getLocale();
		if (locale == null) {
			locale = Locale.getDefault();
		}
		// 当前国际化字符串
		localeStr = "_" + locale.toString();
		// 默认的国际化字符串为中文
		defaultLocaleStr = "_zh_CN";
		// 国际化异常文件路径下的所有文件路径;[路径示例:i18n/omas/exception/base_zh_CN.properties]
		String[] propertiesPathList = PropertyReader
				.getFile("classpath*:i18n/**/exception/*.properties");
		String errorMessage = null;
		if (propertiesPathList.length == 0) {// 表示没有用到异常国际化,如直接在抛出异常时写中文异常信息等.
			return key;
		} else {// 表示存在国际化异常信息文件
			String filePath = propertiesPathList[0];
			if (!"".equals(fileName)) {// 表示项目的国际化文件是按照模块进行划分的,每个模块存在一个国际化文件.
				String realPath = "/"
						+ getFullPath(filePath, localeStr, fileName);
				errorMessage = PropertyReader.getValue(realPath, key);
			} else {// 表示项目只有一个国际化文件.
				String realPath = "/" + getFullPath(filePath, localeStr, "");
				errorMessage = PropertyReader.getValue(realPath, key);
			}
		}
		return errorMessage;

	}

	/**
	 * 获取文件原始名称
	 *
	 * @param path
	 *            国际化文件路径
	 * @return 如blog_zh_CN中的blog
	 */
	private String getFileName(String path) {
		int k = path.lastIndexOf("/");
		String fileName = path.substring(k + 1);
		int j = fileName.lastIndexOf(".");
		String name = fileName.substring(0, j);
		int m = name.indexOf("_");
		String result = name.substring(0, m);
		return result;
	}

	/**
	 * 得到符合当前浏览器环境下的文件路径
	 *
	 * @param path
	 *            国际化文件路径
	 * @param local
	 *            国际化local,如_zh_CN/_zh_TW
	 * @return 如i18n/omas/exception/base_zh_TW.properties
	 */
	private String getFullPath(String path, String local, String name) {
		String fileName = "";
		if ("".equals(name)) {
			fileName = getFileName(path);
		} else {
			fileName = name;
		}
		String localName = fileName + local;
		int k = path.lastIndexOf("/");
		String fullName = path.substring(0, k + 1) + localName + ".properties";
		return fullName;
	}
}
